package way;

import common.Entity.ListNode;

import java.util.HashMap;

public class summation {

    /**
     * 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。
     *
     * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
     *
     * 你可以按任意顺序返回答案。
     *
     * @param nums nums = [2,7,11,15]
     * @param target target = 9
     * @return
     * 输出 [0,1]
     * 因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。
     *
     * 倆数之和
     */
    public int[] twoSum(int[] nums, int target) {
        // int[] indexs = new int[2];
        HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>();

        for(int i = 0; i < nums.length ; i++ ){
            if(hash.containsKey(nums[i])){
                // indexs[0] = i;
                // indexs[1] = hash.get(nums[i]);

                return new int[]{hash.get(nums[i]),i};
            }
            hash.put(target-nums[i],i);
        }
        return null;
    }

    /**
     * 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
     *
     * 请你将两个数相加，并以相同形式返回一个表示和的链表。
     *
     * 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
     *
     * @param l1 l1 = [2,4,3]
     * @param l2 l2 = [5,6,4]
     * @return
     *  输出 [7,0,8]
     *   342 + 465 = 807.
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //创建两个链表
        ListNode r = new ListNode(0);
        ListNode c = r;
        //计数:进位值
        int ca = 0;
        //循环链表，计数
        while(l1 != null || l2 != null || ca != 0){
            //判断当前 取值
            int l1Val = l1 != null ? l1.val : 0;
            int l2Val = l2 != null ? l2.val : 0;
            //计数
            int sum = l1Val + l2Val + ca;
            ca = sum / 10;
            //保存当前值
            ListNode s = new ListNode(sum % 10);
            c.next = s;
            c = s;

            if(l1 != null ) l1 = l1.next;
            if(l2 != null ) l2 = l2.next;
        }

        return r.next;

    }


}
